package com.jscloud.bigdata.zk.common;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;

import java.util.Arrays;

/**
 * 创建持久节点
 */
public class ZooKeeperAPIForPERSISTENT {
        public static void main(String[] args) throws Exception {
                //连接字符串
                String connectionstr = "192.168.1.110:2181, 192.168.1.111:2181, 192.168.1.112:2181";

                //指定重试策略
                ExponentialBackoffRetry retrypolicy = new ExponentialBackoffRetry(1000, 3, Integer.MAX_VALUE);

                //创建客户端对象
                CuratorFramework client = CuratorFrameworkFactory.newClient(connectionstr, retrypolicy);

                //启动客户端
                client.start();

                /**
                 *  创建一个允许所有访问的“持久节点”
                 */
//                client.create()
//                        .creatingParentContainersIfNeeded() //递归创建，如果没有父节点，自动创建父节点
//                        .withMode(CreateMode.PERSISTENT) //节点类型，持久节点
//                        .withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE) //设置ACL， 和原生API相同
//                        .forPath("/test02/node01", "test02".getBytes());

                /**
                 *  修改节点数据
                 *  节点下面添加数据与修改是类似的，一个节点下面会有一个数据，新的数据会覆盖旧的数据
                 */
//                client.setData().forPath("/test01/node01", "hello world 2".getBytes());

                /**
                 *  删除节点
                 */
//                Void aVoid = client.delete()
//                                .forPath("/test02/node01");
//                System.out.println("aVoid = " +aVoid);

                /**
                 *  递归删除
                 */
//                client.delete()
//                                .deletingChildrenIfNeeded()
//                                        .forPath("/test01");

                /**
                 *  查看节点
                 *  获取 /test02节点数据 和 Stat信息
                 */
                Stat statinfo = new Stat();
                byte[] nd01 = client.getData()
                                .storingStatIn(statinfo) //获取stat信息存储到stat对象
                                .forPath("/test02");
                System.out.println("该节点信息为===========》" + new String(nd01));
                System.out.println("该节点的数据版本号为：" + statinfo.getVersion());

                /**
                 *  判断节点是否存在
                 */
                Stat existsNodeStat = client.checkExists().forPath("/test02/app3");
                if(existsNodeStat == null) {
                        System.out.println("========节点不存在===========");
                }

                if(existsNodeStat.getEphemeralOwner() > 0) {
                        System.out.println("========是临时节点===========");
                } else  {
                        System.out.println("========是永久节点===========");
                }

                client.close();
        }
}
